import json

from django.http import JsonResponse, HttpResponseNotFound
from django.shortcuts import render
from django.views import View

# 1.符合 restful 风格 功能实现
from rest_framework.decorators import action
from rest_framework.generics import GenericAPIView, CreateAPIView, ListCreateAPIView, RetrieveUpdateDestroyAPIView
from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.viewsets import ModelViewSet, ReadOnlyModelViewSet, ViewSet, GenericViewSet
from rest_framework.mixins import ListModelMixin, CreateModelMixin, UpdateModelMixin, RetrieveModelMixin, \
    DestroyModelMixin

from books.models import BookInfo, HeroInfo
from books.serializers import BookInfoSerializer, BookInfoMySerializer, HeroInfoMySerializer, HeroInfoModelSerializer


# 自定义 分页器
class MyPagination(PageNumberPagination):
    page_size = 1
    page_query_param = 'yema'
    max_page_size = 10

class BookDrfView(ModelViewSet):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer

    pagination_class = LimitOffsetPagination

    # 1.自定义动作--一个功能  获取 最新的 数据
    # methods = ['请求方式'], detail 是否使用 路径里面 PK
    @action(methods=['get'], detail=False)
    def latest(self, request):
        book = BookInfo.objects.latest('-pk')
        ser = self.get_serializer(book)
        return Response(ser.data)

    # 2. 自定义动作--一个功能  只修改  图书的阅读量
    @action(methods=['put'], detail=True)
    def read(self, request, pk):
        book = self.get_object()
        book.bread = request.data.get('bread')
        book.save()
        ser = self.get_serializer(book)
        return Response(ser.data)



class BooksView(ReadOnlyModelViewSet):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoMySerializer


# 英雄的CRUD 操作
class HerosView(ReadOnlyModelViewSet):
    queryset = HeroInfo.objects.all()
    serializer_class = HeroInfoMySerializer


    # 重写 父类的 方法 --只是为了验证 context的数据
    def get_serializer_context(self):
        result = super().get_serializer_context()
        print(result)
        return result



"""
1. DRF 干了什么?
        django  rest  framework :  前后端分离开发---写的少 做的多
                                    1. 序列化  2. 视图集  3. 路由
2. 序列化器 的作用?
                python数据对象  ---> dict/list
                dict/list --- >校验----> python数据对象 
3. 序列化: 
    后--->前
            ser = Serializer(instance=book, many=True)
            ser.data
4. 反序列化:
    前--->后
          ser = Serializer(data=json_dict)
          ser.is_valid() ==> true/false
          ser.save() ---> 手动实现 create
          
          ser.valiadate_data
          
          ser = Serializer(instance=book, data=json_dict)
          ser.is_valid() ==> true/false
          ser.save() --->   手动实现 update
          
          1. validate_<字段名字>
          2. validate(, attrs)
          3. serializers.CharField(参数validators=[过滤函数])
          

5. ModelSerialzier
        1. 定义序列化器  -- "__all__"
        2. 实现了 create/update


6. DRF  中 有自己的 两大对象
       Request 
            data   --> 表单--json--files
            query_params ---查询参数
       Response
            本身就是 返回的 json数据
            
7. DRF 有自己的 视图和 功能扩展类
      View 
      APIView: 2大新对象 request  response --统一处理异常/身份/权限/限流
      GenericAPIView:
              2个类属性  queryset-serializer_class 
              分页属性   pagination_class
              函数:  get_queryset()  get_object(pk=pk) get_serializer(数据对象)
              5个扩展类: ListModelMixin, Create, Retrive, Update, Destroy 
              
      9个 (扩展类,GenericAPIView) : ListModelMixin, Create, Retrive, Update, Destroy 
      
      ViewSet: 继承APIView
              函数名字  是动作action名字
      GenericViewSet: 继承 GenericAPIView
              函数名字  是动作action名字
      ModelViewSet -- 5个功能
      ReadOnlyModelViewSet  --2个功能
        
"""

"""
    查询多个 -- 将python数据对象--->dict/list ---  序列化
    查询1个 -- 将python数据对象--->dict/list ---  序列化


    post前端从参数 --- dict -校验参数-- >将python数据对象 --- 反序列化
    put前端从参数 --- dict -校验参数-- >将python数据对象  --- 反序列化


    json模块 
            dumps -将python数据对象dict/list---> json
            loads - json --- >将python数据对象/list/dict

from books.models import BookInfo, HeroInfo
from books.serializers import BookInfoMySerializer, HeroInfoMySerializer
hero = HeroInfo.objects.get(pk=6)
ser = HeroInfoMySerializer(hero)
ser.data


"""
